Poetry- 打包和依赖管理

Poetry- 打包和依赖管理

官网:https://python-poetry.org/

官方文档:https://python-poetry.org/docs/

Github:GitHub - python-poetry/poetry: Python packaging and dependency management made easy

安装/卸载

先创建环境变量 POETRY_HOME,其值为 Poetry 的安装路径,我设置的是 D:\Poetry

如果不设置这个环境变量直接运行下面的脚本,则会安装到 %APPDATA%\pypoetry,我本地是 C:\Users\wwwli\AppData\Roaming\pypoetry

然后执行

(Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | py -

然后将 D:\Poetry\bin 添加到 Path 这个环境变量中,再新开一个 powershell 窗口输入 poetry --version,如果可以正常输出版本,即安装成功

如果没有自定义安装目录,那就是将 C:\Users\wwwli\AppData\Roaming\Python\Scripts 添加到 PATH

PS C:\Windows\System32> poetry --version
Poetry (version 1.5.1)

然后执行,这样,Bash 就能支持 Poetry 的命令补全

poetry completions bash >> ~/.bash_completion

之后,我们可以通过 poetry self update 来检查升级,Poetry 可以通过这个命令自己升级自己

卸载脚本为

(Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | py - --uninstall

执行即可卸载

命令行下的使用

根据模板创建项目

poetry new PoetryProject 在执行命令的目录创建一个项目,之后我们可以通过 Pycharm 导入这个项目,注意导入之后,默认使用的是主解释器环境而不是 Poetry 中的虚拟环境,我们需要在设置中更换项目的解释器为 Poetry 环境下的解释器,更换之后,就开始使用使用虚拟环境,我们可以注意到已下载的包的列表的刷新。

官方文档:The pyproject.toml file


在 Python 项目的根目录下执行 poetry init 可以以一种交互式的方式为项目生成 pyproject.toml 文件


指定源

我们可以在这里指定非官方源,比如官方源的镜像,比如阿里云,也可以执行自己的源,比如自己的私服,跟 Maven 私服一样,Python 也可以有私服,不手动指定源的话默认使用 PyPI

Repositories

我们在指定源的时候需要指定其优先级,查找依赖的时候会按照优先级挨个查找源,优先级高的源里查不到就从排在后面的源里查,

如果源连不上,那就会直接报错,PyPI 经常连不上,所以我们建议手动设置其他院为默认源,替换掉 PyPI

源的优先级从高到低为:

  1. default source,
  2. primary sources,
  3. implicit PyPI (unless disabled by another default source or configured explicitly),
  4. secondary sources (DEPRECATED),
  5. supplemental sources.

如果有多个源位于同意优先级,则按照在 pyproject.toml 中的出现顺序为其排序顺序。

缓存

为了改善用户体验和避免重复的网络请求,Poetry 为包源使用了多个缓存。第一级缓存是基于缓存控制头的缓存,用于几乎所有 HTTP 请求。此外,每个 HTTP 支持的包源都会在获取或生成包时缓存与包相关的元数据。此外,下载的文件 (包发行版) 也会被缓存。


指定依赖

Dependency specification

pyproject.toml 文件的 tool.poetry.dependencies 下有四种指定依赖版本的方式

除了引入源中的包,我们还可以引入其他类型的来源的包

我们在指定依赖的版本的时候,也可以指定依赖来自于哪个源(source 属性),比如我们自己的私服

你还可以指定仅为特定的 Python 版本安装依赖项(python 属性)

如果需要为依赖项提供更复杂的安装条件,Poetry 可以通过 markers 属性支持环境标记

简而言之就是,我们在执行依赖的时候,可以指定这个依赖的生效条件,我们甚至可以为不同的 python 版本指定不同的包的版本,为不同的依赖的版本指定不同的类型的来源这些都是可以做到的


当我们修改了 pyproject.toml 文件的时候,pycharm 会弹出提示,提示我们可以更新项目,执行 poetry lock 或者 poetry update

https://python-poetry.org/docs/cli/

poetry update:更新(依赖要求的版本限制范围内的)最新版本的依赖,并更新 poetry.lock

比如你在 pyproject.toml 中制定了依赖的最高版本为 1.0,现在有一个 1.1 的版本来了,调用 poetry update 也是不会更新的

poetry lock:This command locks (without installing) the dependencies specified in 将 pyproject.toml 中指定的依赖项的信息记录到 poetry.lock 文件中

poetry.lock 文件中最有价值的信息就是依赖的版本和 hash,这样当别人拿到这个项目,然后打包的时候,通过对比就能看出,这个环境下下载的依赖跟原先的环境下载的是不是同一个依赖,这样就可以确保确定性构建和依赖项解析。这样,在不同环境打包和安装就有了一致性的保证。


虚拟环境

把虚拟环境的安装目录也换到一个专门的目录中,比如 poetry_virtual 中

poetry 仍然需要

通过 poetry new PoetryProject 创建了项目之后,依然需要手动创建一个虚拟环境,再用 pycharm 打开的时候,pycharm 才能默认使用这个虚拟环境,有意思,TODO,其实这个一些 Pycharm 应该是可以做成自动化的步骤的,但是,他没有,说明还有优化空间,

poetry env list 查看所有虚拟环境

poetry env info 查看所有虚拟环境的信息,比如所保存的路径,状态等等。

大的环境管理。

可能做不到,不能做到创建不同版本的虚拟环境,也就是 poetry 只能做到同一版本的环境,不同项目使用不同版本的依赖,也就是包隔离,但是做不到管理不同的版本,

管理不同的版本,得依赖 pyenv,这个在文章《pyenv- 环境管理.md》中有所介绍,装完了 pyenv 之后,再来看,这部分,TODO,

把这个搞完,包管理基本上就搞完了,TODO






还要搞清楚怎么打包


Pycharm 中的使用


按照官方的脚本出问题了,得改脚本,操!

或者上网搜一下。

通过设置 powershell 的网络代理解决,《powershell_note.md》的 lesson5 变量 小节

安装 poetry 的过程中出现了依赖冲突,我怀疑是跟我本地已经下载的包出现了冲突,所以我把本地的包清零看看。

我算是第一次感觉到依赖地狱(dependency hell)了


解决包管理冲突 pipdeptree,下载 pip install pipdeptree,然后直接运行 pipdeptree 即可,非常方便,

Pycharm 集成了吗?


https://towardsdatascience.com/configure-a-poetry-environment-that-runs-in-pycharm-eba47420f0b6

看这个文章,感觉命令行更好用,直接编辑 pyproject.toml 文件反而不好用了。